home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / textual / tex / files / !preview / RCS / c / dviread < prev    next >
Encoding:
Text File  |  1990-12-07  |  54.3 KB  |  2,354 lines

  1. head     1.4;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    gtoal:1.4;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.4
  10. date     91.03.02.14.24.05;  author gtoal;  state Exp;
  11. branches ;
  12. next     1.3;
  13.  
  14. 1.3
  15. date     91.03.02.14.09.25;  author gtoal;  state Exp;
  16. branches ;
  17. next     1.2;
  18.  
  19. 1.2
  20. date     91.03.02.13.59.09;  author gtoal;  state Exp;
  21. branches ;
  22. next     1.1;
  23.  
  24. 1.1
  25. date     91.03.02.13.55.43;  author gtoal;  state Exp;
  26. branches ;
  27. next     ;
  28.  
  29.  
  30. desc
  31. @Initial release
  32. @
  33.  
  34.  
  35. 1.4
  36. log
  37. @Problems with an 'extern' which wasn't (another one I'd changed after
  38.  giving 1.0 to IAY)
  39. @
  40. text
  41. @/* dviread.c --- Read dvi file; from dvitype.web.  */
  42.  
  43. #include "web2c.h"
  44. #include <stdarg.h>
  45.  
  46. int debug = 0;
  47.  
  48. /* <unix.io.h>: Simulation of Unix open/write etc in terms of <stdio.h> */
  49. /* version 0.01: created AM 18-oct-86. */
  50.  
  51. #ifndef __unix_io_h
  52. #define __unix_io_h
  53. #define __system_io
  54. #define _iob __iob
  55. #define FILEHANDLE int
  56. /* note that the following macro definitions rely on the internal       */
  57. /* details of the NorCroft C <stdio> implementation.                    */
  58.  
  59. /* flags for OPEN */
  60. #define O_RDONLY 0
  61. #define O_WRONLY 1
  62. #define O_RDWRITE 2
  63.  
  64. /* generates small code per module: */
  65. static char _open_mode[][4] = {"rb", "wb", "rb+"};
  66. static FILE *_open_temp;
  67. #define write(fd,buf,siz) fwrite(buf, 1, siz, &_iob[fd])
  68. #define unixread(fd,buf,siz) fread(buf, 1, siz, &_iob[fd])
  69. #define open(name,mode) \
  70.   ((_open_temp = fopen(name,_open_mode[mode]))!=0 ? _open_temp - _iob : -1)
  71. #define creat(name,prot) \
  72.   ((_open_temp = fopen(name,"wb"))!=0 ? _open_temp - _iob : -1)
  73. #define close(fd) fclose(&_iob[fd])
  74. #define lseek(fd,pos,org) fseek(&_iob[fd],pos,org)
  75. extern int _fisatty(FILE *);
  76. #define isatty(fd) _fisatty(&_iob[fd])
  77. #define unlink(file) remove(file)
  78. #define getpid() 1
  79.  
  80. #endif
  81.  
  82. /* end of <unix.io.h> */
  83. /* 9999 30 */ 
  84. #define maxfonts 100 
  85. #define maxwidths 10000 
  86. #define linelength 79 
  87. #define terminallinelength 150 
  88. #define stacksize 100 
  89. #define namesize 1000 
  90. #define namelength 256
  91. typedef schar ASCIIcode  ; 
  92. typedef file_ptr /* of  char */ textfile  ; 
  93. typedef unsigned char eightbits  ; 
  94. typedef file_ptr /* of  eightbits */ bytefile  ; 
  95. ASCIIcode xord[128]  ; 
  96. char xchr[256]  ; 
  97. bytefile dvifile  ; 
  98. bytefile tfmfile  ; 
  99. integer curloc  ; 
  100. char curname[namelength + 1], realnameoffile[namelength + 1]  ; 
  101. eightbits b0, b1, b2, b3  ; 
  102. integer fontnum[maxfonts + 1]  ; 
  103. integer fontname[maxfonts + 1]  ; 
  104. ASCIIcode names[namesize + 1]  ; 
  105. integer fontchecksum[maxfonts + 1]  ; 
  106. integer fontscaledsize[maxfonts + 1]  ; 
  107. integer fontdesignsize[maxfonts + 1]  ; 
  108. integer fontspace[maxfonts + 1]  ; 
  109. integer fontbc[maxfonts + 1]  ; 
  110. integer fontec[maxfonts + 1]  ; 
  111. integer widthbase[maxfonts + 1]  ; 
  112. integer width[maxwidths + 1]  ; 
  113. integer nf  ; 
  114. integer widthptr  ; 
  115. integer inwidth[256]  ; 
  116. integer tfmchecksum  ; 
  117. integer pixelwidth[maxwidths + 1]  ; 
  118. real conv  ; 
  119. real trueconv  ; 
  120. integer numerator, denominator  ; 
  121. integer mag  ; 
  122. schar outmode  ; 
  123. integer maxpages  ; 
  124. real resolution  ; 
  125. integer newmag  ; 
  126. integer startcount[10]  ; 
  127. boolean startthere[10]  ; 
  128. schar startvals  ; 
  129. integer count[10]  ; 
  130. ASCIIcode buffer[terminallinelength + 1]  ; 
  131. integer bufptr  ; 
  132. boolean inpostamble  ; 
  133. integer textptr  ; 
  134. ASCIIcode textbuf[linelength + 1]  ; 
  135. integer h, v, w, x, y, z, hh, vv  ; 
  136. integer hstack[stacksize + 1], vstack[stacksize + 1], wstack[stacksize + 1], 
  137. xstack[stacksize + 1], ystack[stacksize + 1], zstack[stacksize + 1]  ; 
  138. integer hhstack[stacksize + 1], vvstack[stacksize + 1]  ; 
  139. integer maxv  ; 
  140. integer maxh  ; 
  141. integer maxs  ; 
  142. integer maxvsofar, maxhsofar, maxssofar  ; 
  143. integer totalpages  ; 
  144. integer pagecount  ; 
  145. integer s  ; 
  146. integer ss  ; 
  147. integer curfont  ; 
  148. boolean showing  ; 
  149. integer oldbackpointer  ; 
  150. integer newbackpointer  ; 
  151. boolean started  ; 
  152. integer postloc  ; 
  153. integer firstbackpointer  ; 
  154. integer startloc  ; 
  155. integer k, m, n, p, q  ; 
  156.  
  157. char font_name[256];
  158. int font_size;
  159. int font_charwidth;
  160.  
  161. #include "dvitype.h"
  162. /* External procedures for dvitype                              */
  163. /*   Written by: H. Trickey, 2/19/83 (adapted from TeX's ext.c) */
  164.  
  165. #include <string.h>
  166.  
  167. #define TRUE    1
  168. #define FALSE   0
  169.  
  170. integer argc;
  171. char *fontpath;
  172. extern char *getenv();
  173.  
  174. /*
  175.  * setpaths is called to set up the pointer fontpath
  176.  * as follows:  if the user's environment has a value for TEXFONTS
  177.  * then use it;  otherwise, use defaultfontpath.
  178.  */
  179. setpaths()
  180. {
  181.         register char *envpath;
  182.         
  183.         if ((envpath = getenv("TEXFONTS")) != NULL)
  184.             fontpath = envpath;
  185.         else
  186.             fontpath = TEXFONTS;
  187. }
  188.  
  189. #define namelength 256   /* should agree with dvitype.ch */
  190. /* extern char curname[],realnameoffile[];*/ /* these have size namelength */
  191.  
  192. /*
  193.  *      testaccess(amode,filepath)
  194.  *
  195.  *  Test whether or not the file whose name is in the global curname
  196.  *  can be opened for reading (if mode=READACCESS)
  197.  *  or writing (if mode=WRITEACCESS).
  198.  *
  199.  *  The filepath argument is one of the ...FILEPATH constants defined below.
  200.  *  If the filename given in curname does not begin with '/', we try 
  201.  *  prepending all the ':'-separated areanames in the appropriate path to the
  202.  *  filename until access can be made, if it ever can.
  203.  *
  204.  *  The realnameoffile global array will contain the name that yielded an
  205.  *  access success.
  206.  */
  207.  
  208. #define READACCESS 4
  209. #define WRITEACCESS 2
  210.  
  211. #define NOFILEPATH 0
  212. #define FONTFILEPATH 3
  213.  
  214. static packrealnameoffile(char **cpp);
  215.  
  216.  
  217. testaccess(amode,filepath)
  218. int amode,filepath;
  219. {
  220.     register boolean ok;
  221.     register char *p;
  222.     char *curpathplace;
  223.     int f;
  224.     
  225.     switch(filepath) {
  226.         case NOFILEPATH: curpathplace = NULL; break;
  227.         case FONTFILEPATH: curpathplace = fontpath; break;
  228.         }
  229.     if (curname[0]=='/')        /* file name has absolute path */
  230.         curpathplace = NULL;
  231.     do {
  232.         packrealnameoffile(&curpathplace);
  233.         if (amode==READACCESS) {
  234.             FILE *temp;
  235.             /* use system call "access" to see if we could read it */
  236.             ok = FALSE;
  237.             if ((temp = fopen(realnameoffile, "rb")) != NULL) ok = TRUE;
  238.             if (ok) {
  239.               fclose(temp);
  240.             } else {
  241.               tfatal ("(dviread) Cannot open `%s'\n", realnameoffile);
  242.             }
  243.         } else {
  244.             /* WRITEACCESS: use creat to see if we could create it, but close
  245.             the file again if we're OK, to let pc open it for real */
  246.             f = creat(realnameoffile,0666);
  247.             ok = (f >= 0);
  248.             if (ok)
  249.                 (void) close(f);
  250.             }
  251.     } while (!ok && curpathplace != NULL);
  252.     if (ok) {  /* pad realnameoffile with blanks, as Pascal wants */
  253.         for (p = realnameoffile; *p != '\0'; p++)
  254.             /* nothing: find end of string */ ;
  255.         while (p < &(realnameoffile[namelength]))
  256.             *p++ = ' ';
  257.         }
  258.     return (ok);
  259. }
  260.  
  261. /*
  262.  * packrealnameoffile(cpp) makes realnameoffile contain the directory at *cpp,
  263.  * followed by '/', followed by the characters in curname up until the
  264.  * first blank there, and finally a '\0'.  The cpp pointer is left pointing
  265.  * at the next directory in the path.
  266.  * But: if *cpp == NULL, then we are supposed to use curname as is.
  267.  */
  268. static packrealnameoffile(cpp)
  269.     char **cpp;
  270. {
  271.     register char *p,*realname;
  272.     
  273.     realname = realnameoffile;
  274.     if ((p = *cpp)!=NULL) {
  275.         while ((*p != ',') && (*p != '\0')) {
  276.             *realname++ = *p++;
  277.             if (realname == &(realnameoffile[namelength-1]))
  278.                 break;
  279.             }
  280.         if (*p == '\0') *cpp = NULL; /* at end of path now */
  281.         else *cpp = p+1; /* else get past ':' */
  282. #ifndef ARM
  283.         *realname++ = '/';  /* separate the area from the name to follow */
  284. #endif
  285.         }
  286.     /* now append curname to realname... */
  287.     p = curname + 1;
  288.     while (*p != ' ') {
  289.         if (realname >= &(realnameoffile[namelength-1])) {
  290.             tfatal ("(dviread) Full file name is too long\n");
  291.             break;
  292.             }
  293.         *realname++ = *p++;
  294.         }
  295.     *realname = '\0';
  296. }
  297.  
  298. static char **gargv;
  299. argv(n, buf)
  300. int n;
  301. char buf[];
  302. {
  303.     (void) sprintf(buf+1, "%s ", gargv[n]);
  304. }
  305.  
  306.  
  307. dviread_main(ac, av)
  308.      int ac;
  309.      char **av;
  310. {
  311.   argc = ac;
  312.   gargv = av;
  313.   main_body();
  314. }
  315.  
  316.  
  317. #define char_index      strchr
  318.  
  319.  
  320. /* Open a file; don't return if error */
  321. FILE *openf(name, mode)
  322. char *name, *mode;
  323. {
  324.     FILE *result;
  325.     char *cp;
  326.  
  327.     --name;     /* All names are indexed starting at 1 */
  328.     cp = char_index(name, ' ');
  329.     if (cp) *cp = '\0';
  330.     result = fopen(name, mode);
  331.     if (result) return(result);
  332.     perror(name);
  333.     exit(1);
  334.     /*NOTREACHED*/
  335. }
  336.  
  337. /* Print real number r in format n:m */
  338. printreal(r, n, m)
  339. double r;
  340. int n,m;
  341. {
  342.     char fmt[50];
  343.  
  344.     (void) sprintf(fmt, "%%%d.%df", n, m);
  345.     (void) fprintf(stderr, fmt, r);
  346. }
  347.  
  348. /* Return true on end of line or eof of file, else false */
  349. eoln(f)
  350. FILE *f;
  351. {
  352.     register int c;
  353.  
  354.     if (feof(f)) return(1);
  355.     c = getc(f);
  356.     if (c != EOF)
  357.         (void) ungetc(c, f);
  358.     return (c == '\n' || c == EOF);
  359. }
  360.  
  361. /* Return true on end of file, else false */
  362. #undef eof
  363. int eof(f)
  364. FILE *f;
  365. {
  366.     register int c;
  367.  
  368.     if (feof(f)) return(1);
  369.     c = getc(f);
  370.     if (c != EOF)
  371.         (void) ungetc(c, f);
  372.     return (c == EOF);
  373. }
  374.  
  375. integer zround(f)
  376. double f;
  377. {
  378.     if (f >= 0.0) return(f + 0.5);
  379.     return(f - 0.5);
  380. }
  381.  
  382.  
  383. static int oldhh = -1;
  384. static int oldvv = -1;
  385. static int draw_rule = false;
  386.  
  387.  
  388. initialize () {
  389.     integer i  ; 
  390.   setpaths () ; 
  391.   {register integer for_end; i = 0 ; for_end = 31 ; if ( i <= for_end) do 
  392.     xchr [ i ] = '?' ; 
  393.   while ( i++ < for_end ) ; } 
  394.   xchr [ 32 ] = ' ' ; 
  395.   xchr [ 33 ] = '!' ; 
  396.   xchr [ 34 ] = '"' ; 
  397.   xchr [ 35 ] = '#' ; 
  398.   xchr [ 36 ] = '$' ; 
  399.   xchr [ 37 ] = '%' ; 
  400.   xchr [ 38 ] = '&' ; 
  401.   xchr [ 39 ] = '\'' ; 
  402.   xchr [ 40 ] = '(' ; 
  403.   xchr [ 41 ] = ')' ; 
  404.   xchr [ 42 ] = '*' ; 
  405.   xchr [ 43 ] = '+' ; 
  406.   xchr [ 44 ] = ',' ; 
  407.   xchr [ 45 ] = '-' ; 
  408.   xchr [ 46 ] = '.' ; 
  409.   xchr [ 47 ] = '/' ; 
  410.   xchr [ 48 ] = '0' ; 
  411.   xchr [ 49 ] = '1' ; 
  412.   xchr [ 50 ] = '2' ; 
  413.   xchr [ 51 ] = '3' ; 
  414.   xchr [ 52 ] = '4' ; 
  415.   xchr [ 53 ] = '5' ; 
  416.   xchr [ 54 ] = '6' ; 
  417.   xchr [ 55 ] = '7' ; 
  418.   xchr [ 56 ] = '8' ; 
  419.   xchr [ 57 ] = '9' ; 
  420.   xchr [ 58 ] = ':' ; 
  421.   xchr [ 59 ] = ';' ; 
  422.   xchr [ 60 ] = '<' ; 
  423.   xchr [ 61 ] = '=' ; 
  424.   xchr [ 62 ] = '>' ; 
  425.   xchr [ 63 ] = '?' ; 
  426.   xchr [ 64 ] = '@@' ; 
  427.   xchr [ 65 ] = 'A' ; 
  428.   xchr [ 66 ] = 'B' ; 
  429.   xchr [ 67 ] = 'C' ; 
  430.   xchr [ 68 ] = 'D' ; 
  431.   xchr [ 69 ] = 'E' ; 
  432.   xchr [ 70 ] = 'F' ; 
  433.   xchr [ 71 ] = 'G' ; 
  434.   xchr [ 72 ] = 'H' ; 
  435.   xchr [ 73 ] = 'I' ; 
  436.   xchr [ 74 ] = 'J' ; 
  437.   xchr [ 75 ] = 'K' ; 
  438.   xchr [ 76 ] = 'L' ; 
  439.   xchr [ 77 ] = 'M' ; 
  440.   xchr [ 78 ] = 'N' ; 
  441.   xchr [ 79 ] = 'O' ; 
  442.   xchr [ 80 ] = 'P' ; 
  443.   xchr [ 81 ] = 'Q' ; 
  444.   xchr [ 82 ] = 'R' ; 
  445.   xchr [ 83 ] = 'S' ; 
  446.   xchr [ 84 ] = 'T' ; 
  447.   xchr [ 85 ] = 'U' ; 
  448.   xchr [ 86 ] = 'V' ; 
  449.   xchr [ 87 ] = 'W' ; 
  450.   xchr [ 88 ] = 'X' ; 
  451.   xchr [ 89 ] = 'Y' ; 
  452.   xchr [ 90 ] = 'Z' ; 
  453.   xchr [ 91 ] = '[' ; 
  454.   xchr [ 92 ] = '\\' ; 
  455.   xchr [ 93 ] = ']' ; 
  456.   xchr [ 94 ] = '^' ; 
  457.   xchr [ 95 ] = '_' ; 
  458.   xchr [ 96 ] = '`' ; 
  459.   xchr [ 97 ] = 'a' ; 
  460.   xchr [ 98 ] = 'b' ; 
  461.   xchr [ 99 ] = 'c' ; 
  462.   xchr [ 100 ] = 'd' ; 
  463.   xchr [ 101 ] = 'e' ; 
  464.   xchr [ 102 ] = 'f' ; 
  465.   xchr [ 103 ] = 'g' ; 
  466.   xchr [ 104 ] = 'h' ; 
  467.   xchr [ 105 ] = 'i' ; 
  468.   xchr [ 106 ] = 'j' ; 
  469.   xchr [ 107 ] = 'k' ; 
  470.   xchr [ 108 ] = 'l' ; 
  471.   xchr [ 109 ] = 'm' ; 
  472.   xchr [ 110 ] = 'n' ; 
  473.   xchr [ 111 ] = 'o' ; 
  474.   xchr [ 112 ] = 'p' ; 
  475.   xchr [ 113 ] = 'q' ; 
  476.   xchr [ 114 ] = 'r' ; 
  477.   xchr [ 115 ] = 's' ; 
  478.   xchr [ 116 ] = 't' ; 
  479.   xchr [ 117 ] = 'u' ; 
  480.   xchr [ 118 ] = 'v' ; 
  481.   xchr [ 119 ] = 'w' ; 
  482.   xchr [ 120 ] = 'x' ; 
  483.   xchr [ 121 ] = 'y' ; 
  484.   xchr [ 122 ] = 'z' ; 
  485.   xchr [ 123 ] = '{' ; 
  486.   xchr [ 124 ] = '|' ; 
  487.   xchr [ 125 ] = '}' ; 
  488.   xchr [ 126 ] = '~' ; 
  489.   {register integer for_end; i = 127 ; for_end = 255 ; if ( i <= for_end) do 
  490.     xchr [ i ] = '?' ; 
  491.   while ( i++ < for_end ) ; } 
  492.   {register integer for_end; i = 0 ; for_end = 127 ; if ( i <= for_end) do 
  493.     xord [ chr ( i ) ] = 32 ; 
  494.   while ( i++ < for_end ) ; } 
  495.   {register integer for_end; i = 32 ; for_end = 126 ; if ( i <= for_end) do 
  496.     xord [ xchr [ i ] ] = i ; 
  497.   while ( i++ < for_end ) ; } 
  498.   nf = 0 ; 
  499.   widthptr = 0 ; 
  500.   fontname [ 0 ] = 0 ; 
  501.   fontspace [ 0 ] = 0 ; 
  502.   outmode = 3 ; 
  503.   maxpages = 1000000L ; 
  504.   startvals = 0 ; 
  505.   startthere [ 0 ] = false ; 
  506.   inpostamble = false ; 
  507.   textptr = 0 ; 
  508.   maxv = 2147483548L ; 
  509.   maxh = 2147483548L ; 
  510.   maxs = stacksize + 1 ; 
  511.   maxvsofar = 0 ; 
  512.   maxhsofar = 0 ; 
  513.   maxssofar = 0 ; 
  514.   pagecount = 0 ; 
  515.   oldbackpointer = -1 ; 
  516.   started = false ; 
  517. opendvifile () {
  518.   if ( argc != 2 ) {
  519.     tfatal ("(dviread) %s\n", "Usage: dvitype <dvi-file>" ) ; 
  520.     uexit ( 1 ) ; 
  521.   } 
  522.   argv ( 1 , curname ) ; 
  523.   if ( testaccess ( 4 , 0 ) ) 
  524.   reset ( dvifile , realnameoffile ) ; 
  525.   else {
  526.           tfatal ("(dviread) %s\n", "DVI file not found" ) ; 
  527.     uexit ( 1 ) ; 
  528.   } 
  529.   curloc = 0 ; 
  530. opentfmfile () {
  531.     if ( testaccess ( 4 , 3 ) ) 
  532.   reset ( tfmfile , realnameoffile ) ; 
  533.   else {
  534.       
  535.     tfatal ("(dviread) TFM file not found (`%s')", realnameoffile) ; 
  536.     uexit ( 1 ) ; 
  537.   } 
  538. readtfmword () {
  539.   read ( tfmfile , b0 ) ; 
  540.   read ( tfmfile , b1 ) ; 
  541.   read ( tfmfile , b2 ) ; 
  542.   read ( tfmfile , b3 ) ; 
  543. integer getbyte () {
  544.     register integer Result; eightbits b  ; 
  545.   if ( eof ( dvifile ) ) {
  546.     tfatal ("(dviread) End of file detected.\n");
  547.     Result = 0 ; 
  548.   } else {
  549.       
  550.     read ( dvifile , b ) ; 
  551.     if (feof(dvifile)) tfatal ("(dviread) Last byte of file has been read.\n");
  552.     curloc = curloc + 1 ; 
  553.     Result = b ; 
  554.   } 
  555.   return(Result) ; 
  556. integer signedbyte () {
  557.     register integer Result; eightbits b  ; 
  558.   read ( dvifile , b ) ; 
  559.   curloc = curloc + 1 ; 
  560.   if ( b < 128 ) 
  561.   Result = b ; 
  562.   else Result = b - 256 ; 
  563.   return(Result) ; 
  564. integer gettwobytes () {
  565.     register integer Result; eightbits a, b  ; 
  566.   read ( dvifile , a ) ; 
  567.   read ( dvifile , b ) ; 
  568.   curloc = curloc + 2 ; 
  569.   Result = a * 256 + b ; 
  570.   return(Result) ; 
  571. integer signedpair () {
  572.     register integer Result; eightbits a, b  ; 
  573.   read ( dvifile , a ) ; 
  574.   read ( dvifile , b ) ; 
  575.   curloc = curloc + 2 ; 
  576.   if ( a < 128 ) 
  577.   Result = a * 256 + b ; 
  578.   else Result = ( a - 256 ) * 256 + b ; 
  579.   return(Result) ; 
  580. integer getthreebytes () {
  581.     register integer Result; eightbits a, b, c  ; 
  582.   read ( dvifile , a ) ; 
  583.   read ( dvifile , b ) ; 
  584.   read ( dvifile , c ) ; 
  585.   curloc = curloc + 3 ; 
  586.   Result = ( a * 256 + b ) * 256 + c ; 
  587.   return(Result) ; 
  588. integer signedtrio () {
  589.     register integer Result; eightbits a, b, c  ; 
  590.   read ( dvifile , a ) ; 
  591.   read ( dvifile , b ) ; 
  592.   read ( dvifile , c ) ; 
  593.   curloc = curloc + 3 ; 
  594.   if ( a < 128 ) 
  595.   Result = ( a * 256 + b ) * 256 + c ; 
  596.   else Result = ( ( a - 256 ) * 256 + b ) * 256 + c ; 
  597.   return(Result) ; 
  598. integer signedquad () {
  599.     register integer Result; eightbits a, b, c, d  ; 
  600.   read ( dvifile , a ) ; 
  601.   read ( dvifile , b ) ; 
  602.   read ( dvifile , c ) ; 
  603.   read ( dvifile , d ) ; 
  604.   curloc = curloc + 4 ; 
  605.   a = a&255; b = b&255; c = c&255; d = d&255;
  606.   Result = (a<<24) | (b<<16) | (c<<8) | d;
  607.   return(Result) ; 
  608. integer dvilength () {
  609.     register integer Result; zfseek ( dvifile , 0 , 2 ) ; 
  610.   Result = ftell ( dvifile ) ; 
  611.   return(Result) ; 
  612. zmovetobyte ( n ) 
  613. integer n ; 
  614. {zfseek ( dvifile , n , 0 ) ; 
  615. zprintfont ( f ) 
  616. integer f ; 
  617. {integer k  ; 
  618. static char fname[256];
  619. char *dest = &fname[0];
  620.   if ( f == nf ) 
  621.   (void) Fputs( stderr ,  "UNDEFINED!" ) ; 
  622.   else {
  623.       
  624.     {register integer for_end; k = fontname [ f ] ; for_end = fontname [ f + 
  625.     1 ] - 1 ; if ( k <= for_end) do 
  626.       (void) putc( (*dest++ = xchr [ names [ k ] ]) ,  stderr );
  627.     while ( k++ < for_end ) ; } 
  628.   } 
  629.   *dest = '\0';
  630.   strcpy(font_name, fname);
  631.  
  632. setfontname ( f ) 
  633. integer f ; 
  634. {integer k  ; 
  635. static char fname[256];
  636. char *dest = &fname[0];
  637.   if ( f == nf ) 
  638.   (void) Fputs( stderr ,  "UNDEFINED!" ) ; 
  639.   else {
  640.       
  641.     {register integer for_end; k = fontname [ f ] ; for_end = fontname [ f + 
  642.     1 ] - 1 ; if ( k <= for_end) do 
  643.       *dest++ = xchr [ names [ k ] ];
  644.     while ( k++ < for_end ) ; } 
  645.   } 
  646.   *dest = '\0';
  647.   strcpy(font_name, fname);
  648.  
  649. boolean zinTFM ( z ) 
  650. integer z ; 
  651. {/* 9997 9998 9999 */ register boolean Result; integer k  ; 
  652.   integer lh  ; 
  653.   integer nw  ; 
  654.   integer wp  ; 
  655.   integer alpha, beta  ; 
  656.   readtfmword () ; 
  657.   lh = b2 * 256 + b3 ; 
  658.   readtfmword () ; 
  659.   fontbc [ nf ] = b0 * 256 + b1 ; 
  660.   fontec [ nf ] = b2 * 256 + b3 ; 
  661.   if ( fontec [ nf ] < fontbc [ nf ] ) 
  662.   fontbc [ nf ] = fontec [ nf ] + 1 ; 
  663.   if ( widthptr + fontec [ nf ] - fontbc [ nf ] + 1 > maxwidths ) 
  664.   {
  665.     tfatal ("(dviread) Internal error: width table overflow");
  666.     goto lab9998 ; 
  667.   } 
  668.   wp = widthptr + fontec [ nf ] - fontbc [ nf ] + 1 ; 
  669.   readtfmword () ; 
  670.   nw = b0 * 256 + b1 ; 
  671.   if ( ( nw == 0 ) || ( nw > 256 ) ) 
  672.   goto lab9997 ; 
  673.   {register integer for_end; k = 1 ; for_end = 3 + lh ; if ( k <= for_end) do 
  674.     {
  675.       if ( eof ( tfmfile ) ) 
  676.       goto lab9997 ; 
  677.       readtfmword () ; 
  678.       if ( k == 4 ) 
  679.       if ( b0 < 128 ) 
  680.       tfmchecksum = ( ( b0 * 256 + b1 ) * 256 + b2 ) * 256 + b3 ; 
  681.       else tfmchecksum = ( ( ( b0 - 256 ) * 256 + b1 ) * 256 + b2 ) * 256 + b3 
  682.       ; 
  683.     } 
  684.   while ( k++ < for_end ) ; } 
  685.   if ( wp > 0 ) 
  686.   {register integer for_end; k = widthptr ; for_end = wp - 1 ; if ( k <= 
  687.   for_end) do 
  688.     {
  689.       readtfmword () ; 
  690.       if ( b0 > nw ) 
  691.       goto lab9997 ; 
  692.       width [ k ] = b0 ; 
  693.     } 
  694.   while ( k++ < for_end ) ; } 
  695.   {
  696.     alpha = 16 * z ; 
  697.     beta = 16 ; 
  698.     while ( z >= 8388608L ) {
  699.         
  700.       z = z / 2 ; 
  701.       beta = beta / 2 ; 
  702.     } 
  703.   } 
  704.   {register integer for_end; k = 0 ; for_end = nw - 1 ; if ( k <= for_end) do 
  705.     {
  706.       readtfmword () ; 
  707.       inwidth [ k ] = ( ( ( ( ( b3 * z ) / 256 ) + ( b2 * z ) ) / 256 ) + ( b1 
  708.       * z ) ) / beta ; 
  709.       if ( b0 > 0 ) 
  710.       if ( b0 < 255 ) 
  711.       goto lab9997 ; 
  712.       else inwidth [ k ] = inwidth [ k ] - alpha ; 
  713.     } 
  714.   while ( k++ < for_end ) ; } 
  715.   if ( inwidth [ 0 ] != 0 ) 
  716.   goto lab9997 ; 
  717.   widthbase [ nf ] = widthptr - fontbc [ nf ] ; 
  718.   if ( wp > 0 ) 
  719.   {register integer for_end; k = widthptr ; for_end = wp - 1 ; if ( k <= 
  720.   for_end) do 
  721.     if ( width [ k ] == 0 ) 
  722.     {
  723.       width [ k ] = 2147483647L ; 
  724.       pixelwidth [ k ] = 0 ; 
  725.     } 
  726.     else {
  727.         
  728.       width [ k ] = inwidth [ width [ k ] ] ; 
  729.       pixelwidth [ k ] = round ( conv * ( width [ k ] ) ) ; 
  730.     } 
  731.   while ( k++ < for_end ) ; } 
  732.   widthptr = wp ; 
  733.   Result = true ; 
  734.   goto lab9999 ; 
  735.   lab9997: tfatal ("(dviread) TFM file is bad" ) ; 
  736.   lab9998: Result = false ; 
  737.   lab9999: ; 
  738.   fclose ( tfmfile ); /* gt */
  739.   return(Result) ; 
  740. boolean startmatch () {
  741.     register boolean Result; schar k  ; 
  742.   boolean match  ; 
  743.   match = true ; 
  744.   {register integer for_end; k = 0 ; for_end = startvals ; if ( k <= for_end) 
  745.   do 
  746.     if ( startthere [ k ] && ( startcount [ k ] != count [ k ] ) ) 
  747.     match = false ; 
  748.   while ( k++ < for_end ) ; } 
  749.   Result = match ; 
  750.   return(Result) ; 
  751. inputln () {
  752.     integer k  ; 
  753.   flush ( stderr ) ; 
  754.   if ( eoln ( stdin ) ) 
  755.   readln ( stdin ) ; 
  756.   k = 0 ; 
  757.   while ( ( k < terminallinelength ) && ! eoln ( stdin ) ) {
  758.       
  759.     buffer [ k ] = xord [ getc ( stdin ) ] ; 
  760.     k = k + 1 ; 
  761.   } 
  762.   buffer [ k ] = 32 ; 
  763. integer getinteger () {
  764.     register integer Result; integer x  ; 
  765.   boolean negative  ; 
  766.   if ( buffer [ bufptr ] == 45 ) 
  767.   {
  768.     negative = true ; 
  769.     bufptr = bufptr + 1 ; 
  770.   } 
  771.   else negative = false ; 
  772.   x = 0 ; 
  773.   while ( ( buffer [ bufptr ] >= 48 ) && ( buffer [ bufptr ] <= 57 ) ) {
  774.       
  775.     x = 10 * x + buffer [ bufptr ] - 48 ; 
  776.     bufptr = bufptr + 1 ; 
  777.   } 
  778.   if ( negative ) 
  779.   Result = - (integer) x ; 
  780.   else Result = x ; 
  781.   return(Result) ; 
  782. dialog () {
  783.     /* 1 2 3 4 5 */ integer k  ; 
  784.   lab1:
  785.   outmode = 2 ; 
  786.   lab2:
  787.   startvals = 0 ; 
  788.   lab3:
  789.   maxpages = 1000000L ; 
  790.   lab4:
  791.   resolution = 72000.0 ; 
  792.   lab5:
  793.   newmag = 0 ; 
  794.  
  795. zdefinefont ( e ) 
  796. integer e ; 
  797. {integer f  ; 
  798.   integer p  ; 
  799.   integer n  ; 
  800.   integer c, q, d  ; 
  801.   integer r  ; 
  802.   integer j, k  ; 
  803.   boolean mismatch  ; 
  804.   if ( nf == maxfonts ) 
  805.   {
  806.     tfatal ("(dviread) Too many fonts in dvi file");
  807.     uexit ( 1 ) ; 
  808.   } 
  809.   fontnum [ nf ] = e ; 
  810.   f = 0 ; 
  811.   while ( fontnum [ f ] != e ) f = f + 1 ; 
  812.   c = signedquad () ; 
  813.   fontchecksum [ nf ] = c ; 
  814.   q = signedquad () ; 
  815.   fontscaledsize [ nf ] = q ; 
  816.   d = signedquad () ; 
  817.   fontdesignsize [ nf ] = d ; 
  818.   p = getbyte () ; 
  819.   n = getbyte () ; 
  820.   if ( fontname [ nf ] + n + p > namesize ) 
  821.   {
  822.     tfatal ("(dviread) name capacity exceeded");
  823.     uexit ( 1 ) ; 
  824.   } 
  825.   fontname [ nf + 1 ] = fontname [ nf ] + n + p ; 
  826.   if ( n + p == 0 ) 
  827.   (void) Fputs( stderr ,  "null font name!" ) ; 
  828.   else {
  829.       register integer for_end; k = fontname [ nf ] ; for_end = fontname [ 
  830.   nf + 1 ] - 1 ; if ( k <= for_end) do 
  831.     names [ k ] = getbyte () ; 
  832.   while ( k++ < for_end ) ; } 
  833.   nf = nf + 1 ; 
  834.   setfontname(nf-1);
  835.   nf = nf - 1 ; 
  836.   if ( ( ( outmode == 3 ) && inpostamble ) || ( ( outmode < 3 ) && ! 
  837.   inpostamble ) ) 
  838.   {
  839.     if ( f < nf ) 
  840.     tfatal ("(dviread) bad dvi file (repeated font def)");
  841.   } 
  842.   else {
  843.       
  844.     if ( f == nf ) 
  845.     tfatal ("(dviread) bad dvi file (fontsel before fontdef)");
  846.   } 
  847.   if ( f == nf ) 
  848.   {
  849.     {register integer for_end; k = 1 ; for_end = namelength ; if ( k <= 
  850.     for_end) do 
  851.       curname [ k ] = ' ' ; 
  852.     while ( k++ < for_end ) ; } 
  853.     r = 0 ; 
  854.     {register integer for_end; k = fontname [ nf ] ; for_end = fontname [ nf 
  855.     + 1 ] - 1 ; if ( k <= for_end) do 
  856.       {
  857.         r = r + 1 ; 
  858.         if ( r + 4 > namelength ) 
  859.         {
  860.           tfatal ("(dviread) capacity exceeded (font name too long)");
  861.           uexit ( 1 ) ; 
  862.         } 
  863.         curname [ r ] = xchr [ names [ k ] ] ; 
  864.       } 
  865.     while ( k++ < for_end ) ; } 
  866.     curname [ r + 1 ] = '.' ; 
  867.     curname [ r + 2 ] = 't' ; 
  868.     curname [ r + 3 ] = 'f' ; 
  869.     curname [ r + 4 ] = 'm' ; 
  870.     opentfmfile () ; 
  871.     if ( eof ( tfmfile ) ) 
  872.     (void) Fputs( stderr ,  "---not loaded, TFM file can't be opened!" ) ; 
  873.     else {
  874.         
  875.       if ( ( q <= 0 ) || ( q >= 134217728L ) ) 
  876.       tfatal ("(dviread) bad dvi file (scale)");
  877.       else if ( ( d <= 0 ) || ( d >= 134217728L ) ) 
  878.       tfatal ("(dviread) bad tfm file (bad design size)");
  879.       else if ( inTFM ( q ) ) 
  880.       {
  881.         fontspace [ nf ] = q / 6 ; 
  882.         if ( ( c != 0 ) && ( tfmchecksum != 0 ) && ( c != tfmchecksum ) ) 
  883.         {
  884.           fatal ("(dviread) WARNING: tfm checksum does not match");
  885.         } 
  886.         d = round ( ( 100.0 * conv * q ) / ((double) ( trueconv * d ) ) ) ; 
  887.         font_size = q; /*WIMP*/
  888.         nf = nf + 1 ; 
  889.         fontspace [ nf ] = 0 ; 
  890.       } 
  891.     } 
  892.   } 
  893.   else {
  894.       
  895.     if ( fontchecksum [ f ] != c ) 
  896.     tfatal ("(dviread) inconsistency (check sum doesn't match previous definition)");
  897.     if ( fontscaledsize [ f ] != q ) 
  898.     tfatal ("(dviread) inconsistency (scaled size doesn't match previous definition)");
  899.     if ( fontdesignsize [ f ] != d ) 
  900.     tfatal ("(dviread) inconsistency (design size doesn't match previous definition)");
  901.     j = fontname [ f ] ; 
  902.     k = fontname [ nf ] ; 
  903.     mismatch = false ; 
  904.     while ( j < fontname [ f + 1 ] ) {
  905.         
  906.       if ( names [ j ] != names [ k ] ) 
  907.       mismatch = true ; 
  908.       j = j + 1 ; 
  909.       k = k + 1 ; 
  910.     } 
  911.     if ( k != fontname [ nf + 1 ] ) 
  912.     mismatch = true ; 
  913.     if ( mismatch ) 
  914.     tfatal ("(dviread) inconsistency (font name doesn't match previous definition)");
  915.   } 
  916. flushtext () {
  917. integer k; 
  918.   if ( textptr > 0 ) {
  919.     if ( outmode > 0 ) {
  920.       register integer for_end;
  921.        k = 1 ;
  922.        if (xchr [ textbuf [ k ] ] == ' ') k++; /****** FUDGE!!! ******/
  923.        for_end = textptr ;
  924.        if ( k <= for_end) {
  925.          char text[256]; char *textp = &text[0];
  926.          do {
  927.            *textp++ = xchr [ textbuf [ k ] ];
  928.          } while ( k++ < for_end );
  929.          *textp = '\0';
  930.          DRAW_text(oldhh, oldvv, hh+font_charwidth, vv, text);  /*WIMPHOOK*/
  931.          oldhh = -1; oldvv = -1;
  932.        } 
  933.     } 
  934.     textptr = 0 ; 
  935.   } 
  936. zouttext ( c ) 
  937. ASCIIcode c ; 
  938. {if ( textptr == linelength - 2 ) 
  939.   flushtext () ; 
  940.   textptr = textptr + 1 ; 
  941.   textbuf [ textptr ] = c ; 
  942. integer zfirstpar ( o ) 
  943. eightbits o ; 
  944. {register integer Result; switch ( o ) 
  945.   {case 0 : 
  946.   case 1 : 
  947.   case 2 : 
  948.   case 3 : 
  949.   case 4 : 
  950.   case 5 : 
  951.   case 6 : 
  952.   case 7 : 
  953.   case 8 : 
  954.   case 9 : 
  955.   case 10 : 
  956.   case 11 : 
  957.   case 12 : 
  958.   case 13 : 
  959.   case 14 : 
  960.   case 15 : 
  961.   case 16 : 
  962.   case 17 : 
  963.   case 18 : 
  964.   case 19 : 
  965.   case 20 : 
  966.   case 21 : 
  967.   case 22 : 
  968.   case 23 : 
  969.   case 24 : 
  970.   case 25 : 
  971.   case 26 : 
  972.   case 27 : 
  973.   case 28 : 
  974.   case 29 : 
  975.   case 30 : 
  976.   case 31 : 
  977.   case 32 : 
  978.   case 33 : 
  979.   case 34 : 
  980.   case 35 : 
  981.   case 36 : 
  982.   case 37 : 
  983.   case 38 : 
  984.   case 39 : 
  985.   case 40 : 
  986.   case 41 : 
  987.   case 42 : 
  988.   case 43 : 
  989.   case 44 : 
  990.   case 45 : 
  991.   case 46 : 
  992.   case 47 : 
  993.   case 48 : 
  994.   case 49 : 
  995.   case 50 : 
  996.   case 51 : 
  997.   case 52 : 
  998.   case 53 : 
  999.   case 54 : 
  1000.   case 55 : 
  1001.   case 56 : 
  1002.   case 57 : 
  1003.   case 58 : 
  1004.   case 59 : 
  1005.   case 60 : 
  1006.   case 61 : 
  1007.   case 62 : 
  1008.   case 63 : 
  1009.   case 64 : 
  1010.   case 65 : 
  1011.   case 66 : 
  1012.   case 67 : 
  1013.   case 68 : 
  1014.   case 69 : 
  1015.   case 70 : 
  1016.   case 71 : 
  1017.   case 72 : 
  1018.   case 73 : 
  1019.   case 74 : 
  1020.   case 75 : 
  1021.   case 76 : 
  1022.   case 77 : 
  1023.   case 78 : 
  1024.   case 79 : 
  1025.   case 80 : 
  1026.   case 81 : 
  1027.   case 82 : 
  1028.   case 83 : 
  1029.   case 84 : 
  1030.   case 85 : 
  1031.   case 86 : 
  1032.   case 87 : 
  1033.   case 88 : 
  1034.   case 89 : 
  1035.   case 90 : 
  1036.   case 91 : 
  1037.   case 92 : 
  1038.   case 93 : 
  1039.   case 94 : 
  1040.   case 95 : 
  1041.   case 96 : 
  1042.   case 97 : 
  1043.   case 98 : 
  1044.   case 99 : 
  1045.   case 100 : 
  1046.   case 101 : 
  1047.   case 102 : 
  1048.   case 103 : 
  1049.   case 104 : 
  1050.   case 105 : 
  1051.   case 106 : 
  1052.   case 107 : 
  1053.   case 108 : 
  1054.   case 109 : 
  1055.   case 110 : 
  1056.   case 111 : 
  1057.   case 112 : 
  1058.   case 113 : 
  1059.   case 114 : 
  1060.   case 115 : 
  1061.   case 116 : 
  1062.   case 117 : 
  1063.   case 118 : 
  1064.   case 119 : 
  1065.   case 120 : 
  1066.   case 121 : 
  1067.   case 122 : 
  1068.   case 123 : 
  1069.   case 124 : 
  1070.   case 125 : 
  1071.   case 126 : 
  1072.   case 127 : 
  1073.     Result = o - 0 ; 
  1074.     break ; 
  1075.   case 128 : 
  1076.   case 133 : 
  1077.   case 235 : 
  1078.   case 239 : 
  1079.   case 243 : 
  1080.     Result = getbyte () ; 
  1081.     break ; 
  1082.   case 129 : 
  1083.   case 134 : 
  1084.   case 236 : 
  1085.   case 240 : 
  1086.   case 244 : 
  1087.     Result = gettwobytes () ; 
  1088.     break ; 
  1089.   case 130 : 
  1090.   case 135 : 
  1091.   case 237 : 
  1092.   case 241 : 
  1093.   case 245 : 
  1094.     Result = getthreebytes () ; 
  1095.     break ; 
  1096.   case 143 : 
  1097.   case 148 : 
  1098.   case 153 : 
  1099.   case 157 : 
  1100.   case 162 : 
  1101.   case 167 : 
  1102.     Result = signedbyte () ; 
  1103.     break ; 
  1104.   case 144 : 
  1105.   case 149 : 
  1106.   case 154 : 
  1107.   case 158 : 
  1108.   case 163 : 
  1109.   case 168 : 
  1110.     Result = signedpair () ; 
  1111.     break ; 
  1112.   case 145 : 
  1113.   case 150 : 
  1114.   case 155 : 
  1115.   case 159 : 
  1116.   case 164 : 
  1117.   case 169 : 
  1118.     Result = signedtrio () ; 
  1119.     break ; 
  1120.   case 131 : 
  1121.   case 132 : 
  1122.   case 136 : 
  1123.   case 137 : 
  1124.   case 146 : 
  1125.   case 151 : 
  1126.   case 156 : 
  1127.   case 160 : 
  1128.   case 165 : 
  1129.   case 170 : 
  1130.   case 238 : 
  1131.   case 242 : 
  1132.   case 246 : 
  1133.     Result = signedquad () ; 
  1134.     break ; 
  1135.   case 138 : 
  1136.   case 139 : 
  1137.   case 140 : 
  1138.   case 141 : 
  1139.   case 142 : 
  1140.   case 247 : 
  1141.   case 248 : 
  1142.   case 249 : 
  1143.   case 250 : 
  1144.   case 251 : 
  1145.   case 252 : 
  1146.   case 253 : 
  1147.   case 254 : 
  1148.   case 255 : 
  1149.     Result = 0 ; 
  1150.     break ; 
  1151.   case 147 : 
  1152.     Result = w ; 
  1153.     break ; 
  1154.   case 152 : 
  1155.     Result = x ; 
  1156.     break ; 
  1157.   case 161 : 
  1158.     Result = y ; 
  1159.     break ; 
  1160.   case 166 : 
  1161.     Result = z ; 
  1162.     break ; 
  1163.   case 171 : 
  1164.   case 172 : 
  1165.   case 173 : 
  1166.   case 174 : 
  1167.   case 175 : 
  1168.   case 176 : 
  1169.   case 177 : 
  1170.   case 178 : 
  1171.   case 179 : 
  1172.   case 180 : 
  1173.   case 181 : 
  1174.   case 182 : 
  1175.   case 183 : 
  1176.   case 184 : 
  1177.   case 185 : 
  1178.   case 186 : 
  1179.   case 187 : 
  1180.   case 188 : 
  1181.   case 189 : 
  1182.   case 190 : 
  1183.   case 191 : 
  1184.   case 192 : 
  1185.   case 193 : 
  1186.   case 194 : 
  1187.   case 195 : 
  1188.   case 196 : 
  1189.   case 197 : 
  1190.   case 198 : 
  1191.   case 199 : 
  1192.   case 200 : 
  1193.   case 201 : 
  1194.   case 202 : 
  1195.   case 203 : 
  1196.   case 204 : 
  1197.   case 205 : 
  1198.   case 206 : 
  1199.   case 207 : 
  1200.   case 208 : 
  1201.   case 209 : 
  1202.   case 210 : 
  1203.   case 211 : 
  1204.   case 212 : 
  1205.   case 213 : 
  1206.   case 214 : 
  1207.   case 215 : 
  1208.   case 216 : 
  1209.   case 217 : 
  1210.   case 218 : 
  1211.   case 219 : 
  1212.   case 220 : 
  1213.   case 221 : 
  1214.   case 222 : 
  1215.   case 223 : 
  1216.   case 224 : 
  1217.   case 225 : 
  1218.   case 226 : 
  1219.   case 227 : 
  1220.   case 228 : 
  1221.   case 229 : 
  1222.   case 230 : 
  1223.   case 231 : 
  1224.   case 232 : 
  1225.   case 233 : 
  1226.   case 234 : 
  1227.     Result = o - 171 ; 
  1228.     break ; 
  1229.   } 
  1230.   return(Result) ; 
  1231. integer zrulepixels ( x ) 
  1232. integer x ; 
  1233. {register integer Result; integer n  ; 
  1234.   n = trunc ( conv * x ) ; 
  1235.   if ( n < conv * x ) 
  1236.   Result = n + 1 ; 
  1237.   else Result = n ; 
  1238.   return(Result) ; 
  1239. boolean zspecialcases ( o , p , a ) 
  1240. eightbits o ; 
  1241. integer p , a ; 
  1242. {/* 46 44 30 9998 */ register boolean Result; integer q  ; 
  1243.   integer k  ; 
  1244.   boolean badchar  ; 
  1245.   boolean pure  ; 
  1246.   integer vvv  ; 
  1247.   pure = true ; 
  1248.   switch ( o ) 
  1249.   {case 157 : 
  1250.   case 158 : 
  1251.   case 159 : 
  1252.   case 160 : 
  1253.     {
  1254.       if ( abs ( p ) >= 5 * fontspace [ curfont ] ) 
  1255.       vv = round ( conv * ( v + p ) ) ; 
  1256.       else vv = vv + round ( conv * ( p ) ) ; 
  1257.       if ( outmode > 0 ) 
  1258.       {
  1259.         flushtext () ; 
  1260.         showing = true ; 
  1261.       } 
  1262.       goto lab44 ; 
  1263.     } 
  1264.     break ; 
  1265.   case 161 : 
  1266.   case 162 : 
  1267.   case 163 : 
  1268.   case 164 : 
  1269.   case 165 : 
  1270.     {
  1271.       y = p ; 
  1272.       if ( abs ( p ) >= 5 * fontspace [ curfont ] ) 
  1273.       vv = round ( conv * ( v + p ) ) ; 
  1274.       else vv = vv + round ( conv * ( p ) ) ; 
  1275.       if ( outmode > 0 ) 
  1276.       {
  1277.         flushtext () ; 
  1278.         showing = true ; 
  1279.       } 
  1280.       goto lab44 ; 
  1281.     } 
  1282.     break ; 
  1283.   case 166 : 
  1284.   case 167 : 
  1285.   case 168 : 
  1286.   case 169 : 
  1287.   case 170 : 
  1288.     {
  1289.       z = p ; 
  1290.       if ( abs ( p ) >= 5 * fontspace [ curfont ] ) 
  1291.       vv = round ( conv * ( v + p ) ) ; 
  1292.       else vv = vv + round ( conv * ( p ) ) ; 
  1293.       if ( outmode > 0 ) 
  1294.       {
  1295.         flushtext () ; 
  1296.         showing = true ; 
  1297.       } 
  1298.       goto lab44 ; 
  1299.     } 
  1300.     break ; 
  1301.   case 171 : 
  1302.   case 172 : 
  1303.   case 173 : 
  1304.   case 174 : 
  1305.   case 175 : 
  1306.   case 176 : 
  1307.   case 177 : 
  1308.   case 178 : 
  1309.   case 179 : 
  1310.   case 180 : 
  1311.   case 181 : 
  1312.   case 182 : 
  1313.   case 183 : 
  1314.   case 184 : 
  1315.   case 185 : 
  1316.   case 186 : 
  1317.   case 187 : 
  1318.   case 188 : 
  1319.   case 189 : 
  1320.   case 190 : 
  1321.   case 191 : 
  1322.   case 192 : 
  1323.   case 193 : 
  1324.   case 194 : 
  1325.   case 195 : 
  1326.   case 196 : 
  1327.   case 197 : 
  1328.   case 198 : 
  1329.   case 199 : 
  1330.   case 200 : 
  1331.   case 201 : 
  1332.   case 202 : 
  1333.   case 203 : 
  1334.   case 204 : 
  1335.   case 205 : 
  1336.   case 206 : 
  1337.   case 207 : 
  1338.   case 208 : 
  1339.   case 209 : 
  1340.   case 210 : 
  1341.   case 211 : 
  1342.   case 212 : 
  1343.   case 213 : 
  1344.   case 214 : 
  1345.   case 215 : 
  1346.   case 216 : 
  1347.   case 217 : 
  1348.   case 218 : 
  1349.   case 219 : 
  1350.   case 220 : 
  1351.   case 221 : 
  1352.   case 222 : 
  1353.   case 223 : 
  1354.   case 224 : 
  1355.   case 225 : 
  1356.   case 226 : 
  1357.   case 227 : 
  1358.   case 228 : 
  1359.   case 229 : 
  1360.   case 230 : 
  1361.   case 231 : 
  1362.   case 232 : 
  1363.   case 233 : 
  1364.   case 234 : 
  1365.     {
  1366.       if ( outmode > 0 ) 
  1367.       {
  1368.         flushtext () ; 
  1369.         showing = true ; 
  1370.         DRAW_selfont(p);  /*WIMPHOOK*/
  1371.       } 
  1372.       goto lab46 ; 
  1373.     } 
  1374.     break ; 
  1375.   case 235 : 
  1376.   case 236 : 
  1377.   case 237 : 
  1378.   case 238 : 
  1379.     {
  1380.       if ( outmode > 0 ) 
  1381.       {
  1382.         flushtext () ; 
  1383.         showing = true ; 
  1384.         DRAW_selfont(p);  /*WIMPHOOK*/
  1385.       } 
  1386.       goto lab46 ; 
  1387.     } 
  1388.     break ; 
  1389.   case 243 : 
  1390.   case 244 : 
  1391.   case 245 : 
  1392.   case 246 : 
  1393.     {
  1394.       if ( outmode > 0 ) 
  1395.       {
  1396.         flushtext () ; 
  1397.         showing = true ; 
  1398.       } 
  1399.       definefont ( p ) ; 
  1400.       DRAW_deffont(p, font_name, font_size>>12, mag);  /*WIMPHOOK*/
  1401.       goto lab30 ; 
  1402.     } 
  1403.     break ; 
  1404.   case 239 : 
  1405.   case 240 : 
  1406.   case 241 : 
  1407.   case 242 : 
  1408.     {
  1409.       if ( outmode > 0 ) 
  1410.       {
  1411.         flushtext () ; 
  1412.         showing = true ; 
  1413.         /* We regressed a version since IAY was working from 1.0 and
  1414.            we were at 1.1 -- so let's redo this 'fix' */
  1415.         /*tfatal ("BARF %ld%s%s",  (long)a , ": " , "xxx '" ) ; */
  1416.       } 
  1417.       badchar = false ; 
  1418.       if ( p < 0 ) 
  1419.       if ( ! showing ) 
  1420.       {
  1421.         flushtext () ; 
  1422.         showing = true ; 
  1423.         tfatal ("(dviread) bad dvi file (string of negative length)");
  1424.       } 
  1425.       else
  1426.       tfatal ("(dviread) bad dvi file (string of negative length)");
  1427.       {register integer for_end; k = 1 ; for_end = p ; if ( k <= for_end) do 
  1428.         {
  1429.           q = getbyte () ; 
  1430.           if ( ( q < 32 ) || ( q > 126 ) ) 
  1431.           badchar = true ; 
  1432.           if ( showing ) 
  1433.           (void) putc( xchr [ q ] ,  stderr );
  1434.         } 
  1435.       while ( k++ < for_end ) ; } 
  1436.       if ( showing ) 
  1437.       (void) putc( '\'' ,  stderr );
  1438.       if ( badchar ) 
  1439.       if ( ! showing ) 
  1440.       {
  1441.         flushtext () ; 
  1442.         showing = true ; 
  1443.         tfatal ("(dviread) bad dvi file (non-ASCII character in xxx command)");
  1444.       } 
  1445.       else
  1446.       tfatal ("(dviread) bad dvi file (non-ASCII character in xxx command)");
  1447.       goto lab30 ; 
  1448.     } 
  1449.     break ; 
  1450.   case 247 : 
  1451.     {
  1452.       if ( ! showing ) 
  1453.       {
  1454.         flushtext () ; 
  1455.         showing = true ; 
  1456.         tfatal ("(dviread) bad dvi file (preamble command within a page)");
  1457.       } 
  1458.       else
  1459.       tfatal ("(dviread) bad dvi file (preamble command within a page)");
  1460.       goto lab9998 ; 
  1461.     } 
  1462.     break ; 
  1463.   case 248 : 
  1464.   case 249 : 
  1465.     {
  1466.       if ( ! showing ) 
  1467.       {
  1468.         flushtext () ; 
  1469.         showing = true ; 
  1470.         tfatal ("(dviread) bad dvi file (postamble command within a page)");
  1471.       } 
  1472.       else
  1473.         tfatal ("(dviread) bad dvi file (postamble command within a page)");
  1474.       goto lab9998 ; 
  1475.     } 
  1476.     break ; 
  1477.     default: 
  1478.     {
  1479.       if ( ! showing ) 
  1480.       {
  1481.         flushtext () ; 
  1482.         showing = true ; 
  1483.         tfatal ("(dviread) bad dfi file (undefined command)");
  1484.       } 
  1485.       else
  1486.         tfatal ("(dviread) bad dfi file (undefined command)");
  1487.       goto lab30 ; 
  1488.     } 
  1489.     break ; 
  1490.   } 
  1491.   lab44: if ( ( v > 0 ) && ( p > 0 ) ) 
  1492.   if ( v > 2147483647L - p ) 
  1493.   {
  1494.     if ( ! showing ) 
  1495.     {
  1496.       flushtext () ; 
  1497.       showing = true ; 
  1498.       fatal ("(dviread) WARNING: arithmetic overflow! parameter changed from %d to %d", p, 2147483647L - v );
  1499.     } 
  1500.     else
  1501.       fatal ("(dviread) WARNING: arithmetic overflow! parameter changed from %d to %d", p, 2147483647L - v );
  1502.     p = 2147483647L - v ; 
  1503.   } 
  1504.   if ( ( v < 0 ) && ( p < 0 ) ) 
  1505.   if ( - (integer) v > p + 2147483647L ) 
  1506.   {
  1507.     if ( ! showing ) 
  1508.     {
  1509.       flushtext () ; 
  1510.       showing = true ; 
  1511.       fatal ("(dviread) WARNING: arithmetic overflow! parameter changed from %d to %d", p, (int) (-v - 2147483647L));
  1512.     } 
  1513.     else
  1514.       fatal ("(dviread) WARNING: arithmetic overflow! parameter changed from %d to %d", p, (int) (-v - 2147483647L));
  1515.     p = ( - (integer) v ) - 2147483647L ; 
  1516.   } 
  1517.   vvv = round ( conv * ( v + p ) ) ; 
  1518.   if ( abs ( vvv - vv ) > 2 ) 
  1519.   if ( vvv > vv ) 
  1520.   vv = vvv - 2 ; 
  1521.   else vv = vvv + 2 ; 
  1522.   v = v + p ; 
  1523.   if ( abs ( v ) > maxvsofar ) 
  1524.   {
  1525.     if ( abs ( v ) > maxv + 99 ) 
  1526.     {
  1527.       if ( ! showing ) 
  1528.       {
  1529.         flushtext () ; 
  1530.         showing = true ; 
  1531. /*
  1532.         tfatal ("%ld%s%s%ld%c",  (long)a , ": " , "warning: |v|>" , (long)maxv , '!' ) ; 
  1533. */
  1534.       } 
  1535.       else
  1536. /*
  1537.       tfatal ("%c%s%ld%c",  ' ' , "warning: |v|>" , (long)maxv , '!' ) ; 
  1538. */
  1539.       maxv = abs ( v ) ; 
  1540.     } 
  1541.     maxvsofar = abs ( v ) ; 
  1542.   } 
  1543.   goto lab30 ; 
  1544.   lab46: fontnum [ nf ] = p ; 
  1545.   curfont = 0 ; 
  1546.   while ( fontnum [ curfont ] != p ) curfont = curfont + 1 ; 
  1547.   goto lab30 ; 
  1548.   lab9998: pure = false ; 
  1549.   lab30: Result = pure ; 
  1550.   return(Result) ; 
  1551.  
  1552. boolean dopage () {
  1553.     /* 41 42 43 45 30 9998 9999 */ register boolean Result; 
  1554.   eightbits o  ; 
  1555.   integer p, q  ; 
  1556.   integer a  ; 
  1557.   integer hhh  ; 
  1558.   curfont = nf ; 
  1559.   s = 0 ; 
  1560.   h = 0 ; 
  1561.   v = 0 ; 
  1562.   w = 0 ; 
  1563.   x = 0 ; 
  1564.   y = 0 ; 
  1565.   z = 0 ; 
  1566.   hh = 0 ; 
  1567.   vv = 0 ;
  1568.   DRAW_startpage();  /*WIMPHOOK*/
  1569.   while ( true ) {
  1570.       
  1571.     a = curloc ; 
  1572.     showing = false ; 
  1573.     o = getbyte () ; 
  1574.     p = firstpar ( o ) ; 
  1575.     if ( eof ( dvifile ) ) 
  1576.     {
  1577.       tfatal ("(dviread) bad dvi file (the file ended prematurely)");
  1578.       uexit ( 1 ) ; 
  1579.     } 
  1580.     if ( o < 128 ) 
  1581.     {
  1582.       if ( ( o > 32 ) && ( o <= 126 ) ) 
  1583.       {
  1584.         outtext ( p ) ; 
  1585.         if ( outmode >= 2 ) 
  1586.         {
  1587.           showing = true ; 
  1588.           font_charwidth = pixelwidth [ widthbase [ curfont ] + p ];
  1589.           if ((oldhh == -1) && (oldvv == -1)) {
  1590.             oldhh = hh; oldvv = vv;  /* Note start of rectangle */ /*WIMP*/
  1591.           }
  1592.         } 
  1593.       } 
  1594.       else if ( outmode > 0 ) 
  1595.       {
  1596.         flushtext () ; 
  1597.         showing = true ; 
  1598.          DRAW_char(hh, vv, p);  /*WIMPHOOK*/
  1599.       } 
  1600.       goto lab41 ; 
  1601.     } 
  1602.     else switch ( o ) 
  1603.     {case 128 : 
  1604.     case 129 : 
  1605.     case 130 : 
  1606.     case 131 : 
  1607.       {
  1608.         if ( outmode > 0 ) 
  1609.         {
  1610.           flushtext () ; 
  1611.           showing = true ; 
  1612. /*
  1613.           tfatal ("%ld%s%s%ld%c%ld",  (long)a , ": " , "set" , (long)o - 127 , ' ' , (long)p ) ; 
  1614. */
  1615.         } 
  1616.         goto lab41 ; 
  1617.       } 
  1618.       break ; 
  1619.     case 133 : 
  1620.     case 134 : 
  1621.     case 135 : 
  1622.     case 136 : 
  1623.       {
  1624.         if ( outmode > 0 ) 
  1625.         {
  1626.           flushtext () ; 
  1627.           showing = true ; 
  1628. /*
  1629.           tfatal ("%ld%s%s%ld%c%ld",  (long)a , ": " , "put" , (long)o - 132 , ' ' , (long)p ) ; 
  1630. */
  1631.         } 
  1632.         goto lab41 ; 
  1633.       } 
  1634.       break ; 
  1635.     case 132 : 
  1636.       {
  1637.         if ( outmode > 0 ) 
  1638.         {
  1639.           flushtext () ; 
  1640.           showing = true ; 
  1641.         }
  1642.         draw_rule = true; /*WIMP*/
  1643.         goto lab42 ; 
  1644.       } 
  1645.       break ; 
  1646.     case 137 : 
  1647.       {
  1648.         if ( outmode > 0 ) 
  1649.         {
  1650.           flushtext () ; 
  1651.           showing = true ; 
  1652.         } 
  1653.         draw_rule = true;/*WIMP*/
  1654.         goto lab42 ; 
  1655.       } 
  1656.       break ; 
  1657.     case 138 : 
  1658.       {
  1659.         if ( outmode >= 2 ) 
  1660.         {
  1661.           showing = true ; 
  1662. /*
  1663.           tfatal ("%ld%s%s",  (long)a , ": " , "nop" ) ; 
  1664. */
  1665.         } 
  1666.         goto lab30 ; 
  1667.       } 
  1668.       break ; 
  1669.     case 139 : 
  1670.       {
  1671.         if ( ! showing ) 
  1672.         {
  1673.           flushtext () ; 
  1674.           showing = true ; 
  1675.           tfatal ("(dviread) bad dvi file (bop occurred before eop)");
  1676.         } 
  1677.         else
  1678.           tfatal ("(dviread) bad dvi file (bop occurred before eop)");
  1679.         goto lab9998 ; 
  1680.       } 
  1681.       break ; 
  1682.     case 140 : 
  1683.       {
  1684.         if ( outmode > 0 ) 
  1685.         {
  1686.           flushtext () ; 
  1687.           showing = true ; 
  1688.         } 
  1689.         if ( s != 0 ) 
  1690.         if ( ! showing ) 
  1691.         {
  1692.           flushtext () ; 
  1693.           showing = true ; 
  1694.           tfatal ("(dviread) bad dvi file (stack not empty at end of page)");
  1695.         } 
  1696.         else
  1697.           tfatal ("(dviread) bad dvi file (stack not empty at end of page)");
  1698.         Result = true ; 
  1699.         DRAW_endpage(maxh/* page_width */,  maxv/* page_height */,  count/* page_counters */); /*WIMPHOOK*/
  1700.         goto lab9999 ; 
  1701.       } 
  1702.       break ; 
  1703.     case 141 : 
  1704.       {
  1705.         if ( outmode > 0 ) 
  1706.         {
  1707.           flushtext () ; 
  1708.           showing = true ; 
  1709.         } 
  1710.         if ( s == maxssofar ) 
  1711.         {
  1712.           maxssofar = s + 1 ; 
  1713.           if ( s == maxs ) 
  1714.           if ( ! showing ) 
  1715.           {
  1716.             flushtext () ; 
  1717.             showing = true ; 
  1718.             tfatal ("(dviread) bad dvi file (deeper than claimed in postamble)");
  1719.           } 
  1720.           else
  1721.             tfatal ("(dviread) bad dvi file (deeper than claimed in postamble)");
  1722.           ; 
  1723.           if ( s == stacksize ) 
  1724.           {
  1725.             if ( ! showing ) 
  1726.             {
  1727.               flushtext () ; 
  1728.               showing = true ; 
  1729.               tfatal ("(dviread) capacity exceeded (stack)");
  1730.             } 
  1731.             else
  1732.               tfatal ("(dviread) capacity exceeded (stack)");
  1733.             goto lab9998 ; 
  1734.           } 
  1735.         } 
  1736.         hstack [ s ] = h ; 
  1737.         vstack [ s ] = v ; 
  1738.         wstack [ s ] = w ; 
  1739.         xstack [ s ] = x ; 
  1740.         ystack [ s ] = y ; 
  1741.         zstack [ s ] = z ; 
  1742.         hhstack [ s ] = hh ; 
  1743.         vvstack [ s ] = vv ; 
  1744.         s = s + 1 ; 
  1745.         ss = s - 1 ; 
  1746.         goto lab45 ; 
  1747.       } 
  1748.       break ; 
  1749.     case 142 : 
  1750.       {
  1751.         if ( outmode > 0 ) 
  1752.         {
  1753.           flushtext () ; 
  1754.           showing = true ; 
  1755.         } 
  1756.         if ( s == 0 ) 
  1757.         if ( ! showing ) 
  1758.         {
  1759.           flushtext () ; 
  1760.           showing = true ; 
  1761.           tfatal ("(dviread) bad dvi file"); 
  1762.         } 
  1763.         else
  1764.           tfatal ("(dviread) bad dvi file");
  1765.         else {
  1766.             
  1767.           s = s - 1 ; 
  1768.           hh = hhstack [ s ] ; 
  1769.           vv = vvstack [ s ] ; 
  1770.           h = hstack [ s ] ; 
  1771.           v = vstack [ s ] ; 
  1772.           w = wstack [ s ] ; 
  1773.           x = xstack [ s ] ; 
  1774.           y = ystack [ s ] ; 
  1775.           z = zstack [ s ] ; 
  1776.         } 
  1777.         ss = s ; 
  1778.         goto lab45 ; 
  1779.       } 
  1780.       break ; 
  1781.     case 143 : 
  1782.     case 144 : 
  1783.     case 145 : 
  1784.     case 146 : 
  1785.       {
  1786. #ifdef PROPER
  1787.         if ( ( p >= fontspace [ curfont ] ) || ( p <= -4 * fontspace [ curfont 
  1788.         ] ) ) 
  1789.         {
  1790.           outtext ( 32 ) ; 
  1791.           hh = round ( conv * ( h + p ) ) ; 
  1792.         } 
  1793.         else
  1794. #endif
  1795.         {
  1796.           if (outmode > 0) flushtext();
  1797.           hh = hh + round ( conv * ( p ) ) ; 
  1798.         }
  1799.         if ( outmode >= 2 ) 
  1800.         {
  1801.           showing = true ; 
  1802.         } 
  1803.         q = p ; 
  1804.         goto lab43 ; 
  1805.       } 
  1806.       break ; 
  1807.     case 147 : 
  1808.     case 148 : 
  1809.     case 149 : 
  1810.     case 150 : 
  1811.     case 151 : 
  1812.       {
  1813.         w = p ; 
  1814. #ifdef PROPER
  1815.         if ( ( p >= fontspace [ curfont ] ) || ( p <= -4 * fontspace [ curfont 
  1816.         ] ) ) 
  1817.         {
  1818.           outtext ( 32 ) ; 
  1819.           hh = round ( conv * ( h + p ) ) ; 
  1820.         } 
  1821.         else
  1822. #endif
  1823.         {
  1824.           if (outmode > 0) flushtext();
  1825.           hh = hh + round ( conv * ( p ) ) ; 
  1826.         }
  1827.         if ( outmode >= 2 ) 
  1828.         {
  1829.           showing = true ; 
  1830.         } 
  1831.         q = p ; 
  1832.         goto lab43 ; 
  1833.       } 
  1834.       break ; 
  1835.     case 152 : 
  1836.     case 153 : 
  1837.     case 154 : 
  1838.     case 155 : 
  1839.     case 156 : 
  1840.       {
  1841.         x = p ; 
  1842. #ifdef PROPER
  1843.         if ( ( p >= fontspace [ curfont ] ) || ( p <= -4 * fontspace [ curfont 
  1844.         ] ) ) 
  1845.         {
  1846.           outtext ( 32 ) ; 
  1847.           hh = round ( conv * ( h + p ) ) ; 
  1848.         } 
  1849.         else
  1850. #endif
  1851.         {
  1852.           if (outmode > 0) flushtext();
  1853.           hh = hh + round ( conv * ( p ) ) ; 
  1854.         }
  1855.         if ( outmode >= 2 ) 
  1856.         {
  1857.           showing = true ; 
  1858.         } 
  1859.         q = p ; 
  1860.         goto lab43 ; 
  1861.       } 
  1862.       break ; 
  1863.       default: 
  1864.       if ( specialcases ( o , p , a ) ) 
  1865.       goto lab30 ; 
  1866.       else goto lab9998 ; 
  1867.       break ; 
  1868.     } 
  1869.     lab41: if ( p < 0 ) 
  1870.     p = 255 - ( ( -1 - p ) % 256 ) ; 
  1871.     else if ( p >= 256 ) 
  1872.     p = p % 256 ; 
  1873.     if ( ( p < fontbc [ curfont ] ) || ( p > fontec [ curfont ] ) ) 
  1874.     q = 2147483647L ; 
  1875.     else q = width [ widthbase [ curfont ] + p ] ; 
  1876.     if ( q == 2147483647L ) 
  1877.     {
  1878.       if ( ! showing ) 
  1879.       {
  1880.         flushtext () ; 
  1881.         showing = true ; 
  1882.         tfatal ("(dviread) bad dvi file (character invalid in font)"); 
  1883.       } 
  1884.       else
  1885.         tfatal ("(dviread) bad dvi file (character invalid in font)");
  1886.       printfont ( curfont ) ; 
  1887.       if ( curfont != nf ) 
  1888.       (void) putc( '!' ,  stderr );
  1889.     } 
  1890.     if ( o >= 133 ) 
  1891.     goto lab30 ; 
  1892.     if ( q == 2147483647L ) 
  1893.     q = 0 ; 
  1894.     else hh = hh + pixelwidth [ widthbase [ curfont ] + p ] ; 
  1895.     goto lab43 ; 
  1896.     lab42: q = signedquad () ; 
  1897.     if ( showing ) 
  1898.     {
  1899.       if ( ( p <= 0 ) || ( q <= 0 ) ) {
  1900.         (void) Fputs( stderr ,  " (invisible)" ) ; 
  1901.       } else {
  1902.         if (draw_rule) {
  1903.           DRAW_rule(hh, vv, (long)rulepixels ( p ) ,
  1904.                             (long)rulepixels ( q ));
  1905.         }
  1906.       }
  1907.     } 
  1908.     draw_rule = false;
  1909.     if ( o == 137 ) 
  1910.     goto lab30 ; 
  1911.     hh = hh + rulepixels ( q ) ; 
  1912.     goto lab43 ; 
  1913.     lab43: if ( ( h > 0 ) && ( q > 0 ) ) 
  1914.     if ( h > 2147483647L - q ) 
  1915.     {
  1916.       if ( ! showing ) 
  1917.       {
  1918.         flushtext () ; 
  1919.         showing = true ; 
  1920.         tfatal ("%ld%s%s%ld%s%ld",  (long)a , ": " ,         "arithmetic overflow! parameter changed from " , (long)q , " to " ,         (long)2147483647L - h ) ; 
  1921.       } 
  1922.       else
  1923.       tfatal ("%c%s%ld%s%ld",  ' ' ,       "arithmetic overflow! parameter changed from " , (long)q , " to " ,       (long)2147483647L - h ) ; 
  1924.       q = 2147483647L - h ; 
  1925.     } 
  1926.     if ( ( h < 0 ) && ( q < 0 ) ) 
  1927.     if ( - (integer) h > q + 2147483647L ) 
  1928.     {
  1929.       if ( ! showing ) 
  1930.       {
  1931.         flushtext () ; 
  1932.         showing = true ; 
  1933.         tfatal ("%ld%s%s%ld%s%ld",  (long)a , ": " ,         "arithmetic overflow! parameter changed from " , (long)q , " to " , (long)(         - (integer) h ) - 2147483647L ) ; 
  1934.       } 
  1935.       else
  1936.       tfatal ("%c%s%ld%s%ld",  ' ' ,       "arithmetic overflow! parameter changed from " , (long)q , " to " , (long)(       - (integer) h ) - 2147483647L ) ; 
  1937.       q = ( - (integer) h ) - 2147483647L ; 
  1938.     } 
  1939.     hhh = round ( conv * ( h + q ) ) ; 
  1940.     if ( abs ( hhh - hh ) > 2 ) 
  1941.     if ( hhh > hh ) 
  1942.     hh = hhh - 2 ; 
  1943.     else hh = hhh + 2 ; 
  1944.     h = h + q ; 
  1945.     if ( abs ( h ) > maxhsofar ) 
  1946.     {
  1947.       if ( abs ( h ) > maxh + 99 ) 
  1948.       {
  1949.         if ( ! showing ) 
  1950.         {
  1951.           flushtext () ; 
  1952.           showing = true ; 
  1953.           tfatal ("%ld%s%s%ld%c",  (long)a , ": " , "warning: |h|>" , (long)maxh , '!' ) ; 
  1954.         } 
  1955.         else
  1956.         tfatal ("%c%s%ld%c",  ' ' , "warning: |h|>" , (long)maxh , '!' ) ; 
  1957.         maxh = abs ( h ) ; 
  1958.       } 
  1959.       maxhsofar = abs ( h ) ; 
  1960.     } 
  1961.     goto lab30 ; 
  1962.     lab45: if ( showing ) 
  1963.     {
  1964.     } 
  1965.     goto lab30 ; 
  1966.     lab30: ;
  1967.   } 
  1968.   lab9998: tfatal ("%c\n",  '!' ) ; 
  1969.   Result = false ; 
  1970.   lab9999: ; 
  1971.   return(Result) ; 
  1972. skippages () {
  1973.     /* 9999 */ integer p  ; 
  1974.   unsigned char k  ; 
  1975.   integer downthedrain  ; 
  1976.   showing = false ; 
  1977.   while ( true ) {
  1978.       
  1979.     if ( eof ( dvifile ) ) 
  1980.     {
  1981.       tfatal ("%c%s%s%c",  ' ' , "Bad DVI file: " , "the file ended prematurely"       , '!' ) ; 
  1982.       uexit ( 1 ) ; 
  1983.     } 
  1984.     k = getbyte () ; 
  1985.     p = firstpar ( k ) ; 
  1986.     switch ( k ) 
  1987.     {case 139 : 
  1988.       {
  1989.         newbackpointer = curloc - 1 ; 
  1990.         pagecount = pagecount + 1 ; 
  1991.         {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) 
  1992.         do 
  1993.           count [ k ] = signedquad () ; 
  1994.         while ( k++ < for_end ) ; } 
  1995.         if ( signedquad () != oldbackpointer ) 
  1996.         tfatal ("%s%ld%s%ld%c\n",  "backpointer in byte " , (long)curloc - 4 ,         " should be " , (long)oldbackpointer , '!' ) ; 
  1997.         oldbackpointer = newbackpointer ; 
  1998.         if ( ! started && startmatch () ) 
  1999.         {
  2000.           started = true ; 
  2001.           goto lab9999 ; 
  2002.         } 
  2003.       } 
  2004.       break ; 
  2005.     case 132 : 
  2006.     case 137 : 
  2007.       downthedrain = signedquad () ; 
  2008.       break ; 
  2009.     case 243 : 
  2010.     case 244 : 
  2011.     case 245 : 
  2012.     case 246 : 
  2013.       {
  2014.         definefont ( p ) ; 
  2015.       } 
  2016.       break ; 
  2017.     case 239 : 
  2018.     case 240 : 
  2019.     case 241 : 
  2020.     case 242 : 
  2021.       while ( p > 0 ) {
  2022.           
  2023.         downthedrain = getbyte () ; 
  2024.         p = p - 1 ; 
  2025.       } 
  2026.       break ; 
  2027.     case 248 : 
  2028.       {
  2029.         inpostamble = true ; 
  2030.         goto lab9999 ; 
  2031.       } 
  2032.       break ; 
  2033.       default: 
  2034.       ; 
  2035.       break ; 
  2036.     } 
  2037.   } 
  2038.   lab9999: ; 
  2039. readpostamble () {
  2040.     integer k  ; 
  2041.   integer p, q, m  ; 
  2042.   showing = false ; 
  2043.   postloc = curloc - 5 ; 
  2044.   if ( signedquad () != numerator ) 
  2045.   tfatal ("%s\n",  "numerator doesn't match the preamble!" ) ; 
  2046.   if ( signedquad () != denominator ) 
  2047.   tfatal ("%s\n",  "denominator doesn't match the preamble!" ) ; 
  2048.   if ( signedquad () != mag ) 
  2049.   if ( newmag == 0 ) 
  2050.   tfatal ("%s\n",  "magnification doesn't match the preamble!" ) ; 
  2051.   maxv = signedquad () ; 
  2052.   maxh = signedquad () ; 
  2053.   maxs = gettwobytes () ; 
  2054.   totalpages = gettwobytes () ; 
  2055.   if ( outmode < 3 ) 
  2056.   {
  2057.     if ( maxv + 99 < maxvsofar ) 
  2058.     tfatal ("%s%ld\n",  "warning: observed maxv was " , (long)maxvsofar ) ; 
  2059.     if ( maxh + 99 < maxhsofar ) 
  2060.     if (debug) fprintf( stderr , "%s%ld\n",  "warning: observed maxh was " , (long)maxhsofar ) ; 
  2061.     if ( maxs < maxssofar ) 
  2062.     tfatal ("%s%ld\n",  "warning: observed maxstackdepth was " , (long)maxssofar ) 
  2063.     ; 
  2064.     if ( pagecount != totalpages ) 
  2065.     tfatal ("%s%ld%s%ld%c\n",  "there are really " , (long)pagecount , " pages, not " ,     (long)totalpages , '!' ) ; 
  2066.   } 
  2067.   do {
  2068.       k = getbyte () ; 
  2069.     if ( ( k >= 243 ) && ( k < 247 ) ) 
  2070.     {
  2071.       p = firstpar ( k ) ; 
  2072.       definefont ( p ) ; 
  2073.       k = 138 ; 
  2074.     } 
  2075.   } while ( ! ( k != 138 ) ) ; 
  2076.   if ( k != 249 ) 
  2077.   tfatal ("%s%ld%s\n",  "byte " , (long)curloc - 1 , " is not postpost!" ) ; 
  2078.   q = signedquad () ; 
  2079.   if ( q != postloc ) 
  2080.   tfatal ("%s%ld%c\n",  "bad postamble pointer in byte " , (long)curloc - 4 , '!' ) ; 
  2081.   m = getbyte () ; 
  2082.   if ( m != 2 ) 
  2083.   tfatal ("%s%ld%s%ld%c\n",  "identification in byte " , (long)curloc - 1 , " should be "   , (long)2 , '!' ) ; 
  2084.   k = curloc ; 
  2085.   m = 223 ; 
  2086.   while ( ( m == 223 ) && ! eof ( dvifile ) ) m = getbyte () ; 
  2087.   if ( ! eof ( dvifile ) ) 
  2088.   {
  2089.     tfatal ("%c%s%s%ld%s%c",  ' ' , "Bad DVI file: " , "signature in byte " , (long)curloc     - 1 , " should be 223" , '!' ) ; 
  2090.     uexit ( 1 ) ; 
  2091.   } 
  2092.   else if ( curloc < k + 4 ) 
  2093.   tfatal ("%s%ld%c\n",  "not enough signature bytes at end of file (" , (long)curloc   - k , ')' ) ; 
  2094.  
  2095.   /* *Should* be safe now to close the dvifile */
  2096.   fclose(dvifile);
  2097.  
  2098. main_body() {
  2099.     
  2100.   initialize () ; 
  2101.   dialog () ; 
  2102.   opendvifile () ; 
  2103.   p = getbyte () ; 
  2104.   if ( p != 247 ) 
  2105.   {
  2106.     tfatal ("%c%s%s%c",  ' ' , "Bad DVI file: " ,     "First byte isn't start of preamble!" , '!' ) ; 
  2107.     uexit ( 1 ) ; 
  2108.   } 
  2109.   p = getbyte () ; 
  2110.   if ( p != 2 ) 
  2111.   tfatal ("%s%ld%c\n",  "identification in byte 1 should be " , (long)2 , '!' ) ; 
  2112.   numerator = signedquad () ; 
  2113.   denominator = signedquad () ; 
  2114.   if ( numerator <= 0 ) 
  2115.   {
  2116.     tfatal ("%c%s%s%ld%c",  ' ' , "Bad DVI file: " , "numerator is " , (long)numerator ,     '!' ) ; 
  2117.     uexit ( 1 ) ; 
  2118.   } 
  2119.   if ( denominator <= 0 ) 
  2120.   {
  2121.     tfatal ("%c%s%s%ld%c",  ' ' , "Bad DVI file: " , "denominator is " ,     (long)denominator , '!' ) ; 
  2122.     uexit ( 1 ) ; 
  2123.   } 
  2124.   conv = ( numerator / ((double) 254000.0 ) ) * ( resolution / ((double) 
  2125.   denominator ) ) ; 
  2126.   mag = signedquad () ; 
  2127.   if ( newmag > 0 ) 
  2128.   mag = newmag ; 
  2129.   else if ( mag <= 0 ) 
  2130.   {
  2131.     tfatal ("%c%s%s%ld%c",  ' ' , "Bad DVI file: " , "magnification is " , (long)mag ,     '!' ) ; 
  2132.     uexit ( 1 ) ; 
  2133.   } 
  2134.   trueconv = conv ; 
  2135.   conv = trueconv * ( mag / ((double) 1000.0 ) ) ; 
  2136.   p = getbyte () ; 
  2137. #ifndef ARM
  2138.   if ( outmode == 3 ) 
  2139.   {
  2140.     n = dvilength () ;
  2141.     if ( n < 53 ) 
  2142.     {
  2143.       (void) fprintf( stderr ,
  2144.          "%c%s%s%ld%s%c",  ' ' ,
  2145.           "Bad DVI file: " , "only " , (long)n , " bytes long"       , '!' ) ; 
  2146.       uexit ( 1 ) ; 
  2147.     } 
  2148.     m = n - 4 ; 
  2149.     do {
  2150.         if ( m == 0 ) 
  2151.       {
  2152.         (void) fprintf( stderr ,
  2153.            "%c%s%s%c",  ' ' , "Bad DVI file: " , "all 223s" , '!' ) ; 
  2154.         uexit ( 1 ) ; 
  2155.       } 
  2156.       movetobyte ( m ) ; 
  2157.       k = getbyte () ; 
  2158.       m = m - 1 ; 
  2159.     } while ( ! ( k != 223 ) ) ; 
  2160.     if ( k != 2 ) 
  2161.     {
  2162.       tfatal ("%c%s%s%ld%c",  ' ' , "Bad DVI file: " , "ID byte is " , (long)k , '!' ) ; 
  2163.       uexit ( 1 ) ; 
  2164.     } 
  2165.     movetobyte ( m - 3 ) ; 
  2166.     q = signedquad () ; 
  2167.     if ( ( q < 0 ) || ( q > m - 33 ) ) 
  2168.     {
  2169.       tfatal ("%c%s%s%ld%s%ld%c",  ' ' , "Bad DVI file: " , "post pointer " , (long)q ,       " at byte " , (long)m - 3 , '!' ) ; 
  2170.       uexit ( 1 ) ; 
  2171.     } 
  2172.     movetobyte ( q ) ; 
  2173.     k = getbyte () ; 
  2174.     if ( k != 248 ) 
  2175.     {
  2176.       tfatal ("%c%s%s%ld%s%c",  ' ' , "Bad DVI file: " , "byte " , (long)q , " is not post"       , '!' ) ; 
  2177.       uexit ( 1 ) ; 
  2178.     } 
  2179.     postloc = q ; 
  2180.     firstbackpointer = signedquad () ; 
  2181.     inpostamble = true ; 
  2182.     readpostamble () ; 
  2183.  
  2184.  
  2185.     inpostamble = false ; 
  2186.     q = postloc ; 
  2187.     p = firstbackpointer ; 
  2188.     startloc = -1 ; 
  2189.     if ( p < 0 ) 
  2190.     inpostamble = true ; 
  2191.     else {
  2192.         
  2193.       do {
  2194.           if ( p > q - 46 ) 
  2195.         {
  2196.           tfatal ("%c%s%s%ld%s%ld%c",  ' ' , "Bad DVI file: " , "page link " , (long)p ,           " after byte " , (long)q , '!' ) ; 
  2197.           uexit ( 1 ) ; 
  2198.         } 
  2199.         q = p ; 
  2200.         movetobyte ( q ) ; 
  2201.         k = getbyte () ; 
  2202.         if ( k == 139 ) 
  2203.         pagecount = pagecount + 1 ; 
  2204.         else {
  2205.             
  2206.           tfatal ("%c%s%s%ld%s%c",  ' ' , "Bad DVI file: " , "byte " , (long)q ,           " is not bop" , '!' ) ; 
  2207.           uexit ( 1 ) ; 
  2208.         } 
  2209.         {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) 
  2210.         do 
  2211.           count [ k ] = signedquad () ; 
  2212.         while ( k++ < for_end ) ; } 
  2213.         if ( startmatch () ) 
  2214.         startloc = q ; 
  2215.         p = signedquad () ; 
  2216.       } while ( ! ( p < 0 ) ) ; 
  2217.       if ( startloc < 0 ) 
  2218.       {
  2219.         tfatal ("%c%s",  ' ' , "starting page number could not be found!" ) 
  2220.         ; 
  2221.         uexit ( 1 ) ; 
  2222.       } 
  2223.       movetobyte ( startloc + 1 ) ; 
  2224.       oldbackpointer = startloc ; 
  2225.       {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) do 
  2226.         count [ k ] = signedquad () ; 
  2227.       while ( k++ < for_end ) ; } 
  2228.       p = signedquad () ; 
  2229.       started = true ; 
  2230.     } 
  2231.     if ( pagecount != totalpages ) 
  2232.     tfatal ("%s%ld%s%ld%c\n",  "there are really " , (long)pagecount , " pages, not " ,     (long)totalpages , '!' ) ; 
  2233.   } 
  2234.   else
  2235. #endif
  2236.     skippages () ; 
  2237.   if ( ! inpostamble ) 
  2238.   {
  2239.     while ( maxpages > 0 ) {
  2240.         
  2241.       maxpages = maxpages - 1 ; 
  2242.       {register integer for_end; k = 0 ; for_end = startvals ;
  2243.       while ( k++ < for_end ) ; } 
  2244.       if ( ! dopage () ) 
  2245.       {
  2246.         tfatal ("%c%s%s%c",  ' ' , "Bad DVI file: " , "page ended unexpectedly"         , '!' ) ; 
  2247.         uexit ( 1 ) ; 
  2248.       } 
  2249.       do {
  2250.           k = getbyte () ; 
  2251.         if ( ( k >= 243 ) && ( k < 247 ) ) 
  2252.         {
  2253.           p = firstpar ( k ) ; 
  2254.           definefont ( p ) ; 
  2255.           k = 138 ; 
  2256.         } 
  2257.       } while ( ! ( k != 138 ) ) ; 
  2258.       if ( k == 248 ) 
  2259.       {
  2260.         inpostamble = true ; 
  2261.         goto lab30 ; 
  2262.       } 
  2263.       if ( k != 139 ) 
  2264.       {
  2265.         tfatal ("%c%s%s%ld%s%c",  ' ' , "Bad DVI file: " , "byte " , (long)curloc - 1 ,         " is not bop" , '!' ) ; 
  2266.         uexit ( 1 ) ; 
  2267.       } 
  2268.       newbackpointer = curloc - 1 ; 
  2269.       pagecount = pagecount + 1 ; 
  2270.       {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) do 
  2271.         count [ k ] = signedquad () ; 
  2272.       while ( k++ < for_end ) ; } 
  2273.       if ( signedquad () != oldbackpointer ) 
  2274.       tfatal ("%s%ld%s%ld%c\n",  "backpointer in byte " , (long)curloc - 4 , " should be "       , (long)oldbackpointer , '!' ) ; 
  2275.       oldbackpointer = newbackpointer ; 
  2276.     } 
  2277.     lab30: ; 
  2278.   } 
  2279.   if ( outmode < 3 ) 
  2280.   {
  2281.     if ( ! inpostamble ) 
  2282.     skippages () ; 
  2283.     if ( signedquad () != oldbackpointer ) 
  2284.     tfatal ("%s%ld%s%ld%c\n",  "backpointer in byte " , (long)curloc - 4 , " should be " ,     (long)oldbackpointer , '!' ) ; 
  2285.     readpostamble () ; 
  2286.   } 
  2287. }
  2288. @
  2289.  
  2290.  
  2291. 1.3
  2292. log
  2293. @Re-did fix for unrecognised 'xxx' (got lost when IAY hacked from 1.0, not 1.1)
  2294. @
  2295. text
  2296. @d150 1
  2297. a150 1
  2298. extern char curname[],realnameoffile[]; /* these have size namelength */
  2299. @
  2300.  
  2301.  
  2302. 1.2
  2303. log
  2304. @IAY's upgrade
  2305. @
  2306. text
  2307. @d1398 3
  2308. a1400 1
  2309.         tfatal ("BARF %ld%s%s",  (long)a , ": " , "xxx '" ) ; 
  2310. @
  2311.  
  2312.  
  2313. 1.1
  2314. log
  2315. @Initial revision
  2316. @
  2317. text
  2318. @d150 1
  2319. a150 1
  2320. /* NO! -- NOT external ... extern char curname[],realnameoffile[]; /* these have size namelength */
  2321. d1398 1
  2322. a1398 1
  2323.         /*tfatal ("BARF %ld%s%s",  (long)a , ": " , "xxx '" ) ; Why was this an error, tiggr? */
  2324. @
  2325.